home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / uucp-104.lha / uucp-1.04 / sysh.unx < prev    next >
Text File  |  1993-02-13  |  15KB  |  531 lines

  1. /* sysh.unx -*- C -*-
  2.    The header file for the UNIX system dependent routines.
  3.  
  4.    Copyright (C) 1991, 1992 Ian Lance Taylor
  5.  
  6.    This file is part of the Taylor UUCP package.
  7.  
  8.    This program is free software; you can redistribute it and/or
  9.    modify it under the terms of the GNU General Public License as
  10.    published by the Free Software Foundation; either version 2 of the
  11.    License, or (at your option) any later version.
  12.  
  13.    This program is distributed in the hope that it will be useful, but
  14.    WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.    General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with this program; if not, write to the Free Software
  20.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22.    The author of the program may be contacted at ian@airs.com or
  23.    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
  24.    */
  25.  
  26. #ifndef SYSH_UNX_H
  27.  
  28. #define SYSH_UNX_H
  29.  
  30. #if ANSI_C
  31. /* These structures are used in prototypes but are not defined in this
  32.    header file.  */
  33. struct uuconf_system;
  34. struct sconnection;
  35. #endif
  36.  
  37. /* Make sure the defines do not conflict.  These are in this file
  38.    because they are Unix dependent.  */
  39. #if HAVE_V2_LOCKFILES + HAVE_HDB_LOCKFILES + HAVE_SCO_LOCKFILES + HAVE_SVR4_LOCKFILES + HAVE_COHERENT_LOCKFILES != 1
  40.  #error LOCKFILES define not set or duplicated
  41. #endif
  42.  
  43. /* SCO and SVR4 lockfiles are basically just like HDB lockfiles.  */
  44. #if HAVE_SCO_LOCKFILES || HAVE_SVR4_LOCKFILES
  45. #undef HAVE_HDB_LOCKFILES
  46. #define HAVE_HDB_LOCKFILES 1
  47. #endif
  48.  
  49. #if HAVE_BSD_TTY + HAVE_SYSV_TERMIO + HAVE_POSIX_TERMIOS != 1
  50.  #error Terminal driver define not set or duplicated
  51. #endif
  52.  
  53. #if SPOOLDIR_V2 + SPOOLDIR_BSD42 + SPOOLDIR_BSD43 + SPOOLDIR_HDB + SPOOLDIR_ULTRIX + SPOOLDIR_SVR4 + SPOOLDIR_TAYLOR != 1
  54.  #error Spool directory define not set or duplicated
  55. #endif
  56.  
  57. /* If setreuid is broken, don't use it.  */
  58. #if HAVE_BROKEN_SETREUID
  59. #undef HAVE_SETREUID
  60. #define HAVE_SETREUID 0
  61. #endif
  62.  
  63. /* Get some standard types from the configuration header file.  */
  64. #ifdef PID_T
  65. typedef PID_T pid_t;
  66. #endif
  67.  
  68. #ifdef UID_T
  69. typedef UID_T uid_t;
  70. #endif
  71.  
  72. #ifdef GID_T
  73. typedef GID_T gid_t;
  74. #endif
  75.  
  76. #ifdef OFF_T
  77. typedef OFF_T off_t;
  78. #endif
  79.  
  80. /* On Unix, binary files are the same as text files.  */
  81. #define BINREAD "r"
  82. #define BINWRITE "w"
  83.  
  84. /* If we have sigaction, we can force system calls to not be
  85.    restarted.  */
  86. #if HAVE_SIGACTION
  87. #undef HAVE_RESTARTABLE_SYSCALLS
  88. #define HAVE_RESTARTABLE_SYSCALLS 0
  89. #endif
  90.  
  91. /* If we have sigvec, and we have HAVE_SIGVEC_SV_FLAGS, and
  92.    SV_INTERRUPT is defined, we can force system calls to not be
  93.    restarted (signal.h is included by uucp.h before this point, so
  94.    SV_INTERRUPT will be defined by now if it it ever is).  */
  95. #if HAVE_SIGVEC && HAVE_SIGVEC_SV_FLAGS
  96. #ifdef SV_INTERRUPT
  97. #undef HAVE_RESTARTABLE_SYSCALLS
  98. #define HAVE_RESTARTABLE_SYSCALLS 0
  99. #endif
  100. #endif
  101.  
  102. /* If we were cross-configured, we will have a value of -1 for
  103.    HAVE_RESTARTABLE_SYSCALLS.  In this case, we try to guess what the
  104.    correct value should be.  Yuck.  If we have sigvec, but neither of
  105.    the above cases applied (which we know because they would have
  106.    changed HAVE_RESTARTABLE_SYSCALLS) then we are probably on 4.2BSD
  107.    and system calls are automatically restarted.  Otherwise, assume
  108.    that they are not.  */
  109. #if HAVE_RESTARTABLE_SYSCALLS == -1
  110. #undef HAVE_RESTARTABLE_SYSCALLS
  111. #if HAVE_SIGVEC
  112. #define HAVE_RESTARTABLE_SYSCALLS 1
  113. #else
  114. #define HAVE_RESTARTABLE_SYSCALLS 0
  115. #endif
  116. #endif /* HAVE_RESTARTABLE_SYSCALLS == -1 */
  117.  
  118. /* We don't handle sigset in combination with restartable system
  119.    calls, so we check for it although this combination will never
  120.    happen.  */
  121. #if ! HAVE_SIGACTION && ! HAVE_SIGVEC && HAVE_SIGSET
  122. #if HAVE_RESTARTABLE_SYSCALLS
  123. #undef HAVE_SIGSET
  124. #define HAVE_SIGSET 0
  125. #endif
  126. #endif
  127.  
  128. /* If we don't have restartable system calls, we can ignore
  129.    fsysdep_catch, usysdep_start_catch and usysdep_end_catch.
  130.    Otherwise fsysdep_catch has to do a setjmp.  */
  131.  
  132. #if ! HAVE_RESTARTABLE_SYSCALLS
  133.  
  134. #define fsysdep_catch() (TRUE)
  135. #define usysdep_start_catch()
  136. #define usysdep_end_catch()
  137. #define CATCH_PROTECT
  138.  
  139. #else /* HAVE_RESTARTABLE_SYSCALLS */
  140.  
  141. #if HAVE_SETRET && ! HAVE_SIGSETJMP
  142. #include <setret.h>
  143. #define setjmp setret
  144. #define longjmp longret
  145. #define jmp_buf ret_buf
  146. #else /* ! HAVE_SETRET || HAVE_SIGSETJMP */
  147. #include <setjmp.h>
  148. #if HAVE_SIGSETJMP
  149. #undef setjmp
  150. #undef longjmp
  151. #undef jmp_buf
  152. #define setjmp(s) sigsetjmp ((s), TRUE)
  153. #define longjmp siglongjmp
  154. #define jmp_buf sigjmp_buf
  155. #endif /* HAVE_SIGSETJMP */
  156. #endif /* ! HAVE_SETRET || HAVE_SIGSETJMP */
  157.  
  158. extern volatile sig_atomic_t fSjmp;
  159. extern volatile jmp_buf sSjmp_buf;
  160.  
  161. #define fsysdep_catch() (setjmp (sSjmp_buf) == 0)
  162.  
  163. #define usysdep_start_catch() (fSjmp = TRUE)
  164.  
  165. #define usysdep_end_catch() (fSjmp = FALSE)
  166.  
  167. #define CATCH_PROTECT volatile
  168.  
  169. #endif /* HAVE_RESTARTABLE_SYSCALLS */
  170.  
  171. /* Get definitions for the terminal driver.  */
  172.  
  173. #if HAVE_BSD_TTY
  174. #include <sgtty.h>
  175. struct sbsd_terminal
  176. {
  177.   struct sgttyb stty;
  178.   struct tchars stchars;
  179.   struct ltchars sltchars;
  180. };
  181. typedef struct sbsd_terminal sterminal;
  182. #define fgetterminfo(o, q) \
  183.   (ioctl ((o), TIOCGETP, &(q)->stty) == 0 \
  184.    && ioctl ((o), TIOCGETC, &(q)->stchars) == 0 \
  185.    && ioctl ((o), TIOCGLTC, &(q)->sltchars) == 0)
  186. #define fsetterminfo(o, q) \
  187.   (ioctl ((o), TIOCSETN, &(q)->stty) == 0 \
  188.    && ioctl ((o), TIOCSETC, &(q)->stchars) == 0 \
  189.    && ioctl ((o), TIOCSLTC, &(q)->sltchars) == 0)
  190. #define fsetterminfodrain(o, q) \
  191.   (ioctl ((o), TIOCSETP, &(q)->stty) == 0 \
  192.    && ioctl ((o), TIOCSETC, &(q)->stchars) == 0 \
  193.    && ioctl ((o), TIOCSLTC, &(q)->sltchars) == 0)
  194. #endif /* HAVE_BSD_TTY */
  195.  
  196. #if HAVE_SYSV_TERMIO
  197. #include <termio.h>
  198. typedef struct termio sterminal;
  199. #define fgetterminfo(o, q) (ioctl ((o), TCGETA, (q)) == 0)
  200. #define fsetterminfo(o, q) (ioctl ((o), TCSETA, (q)) == 0)
  201. #define fsetterminfodrain(o, q) (ioctl ((o), TCSETAW, (q)) == 0)
  202. #endif /* HAVE_SYSV_TERMIO */
  203.  
  204. #if HAVE_POSIX_TERMIOS
  205. #include <termios.h>
  206. typedef struct termios sterminal;
  207. #define fgetterminfo(o, q) (tcgetattr ((o), (q)) == 0)
  208. #define fsetterminfo(o, q) (tcsetattr ((o), TCSANOW, (q)) == 0)
  209. #define fsetterminfodrain(o, q) (tcsetattr ((o), TCSADRAIN, (q)) == 0)
  210.  
  211. /* On some systems it is not possible to include both <sys/ioctl.h>
  212.    and <termios.h> in the same source files; I don't really know why.
  213.    On such systems, we pretend that we don't have <sys/ioctl.h>.  */
  214. #if ! HAVE_TERMIOS_AND_SYS_IOCTL_H
  215. #undef HAVE_SYS_IOCTL_H
  216. #define HAVE_SYS_IOCTL_H 0
  217. #endif
  218.  
  219. #endif /* HAVE_POSIX_TERMIOS */
  220.  
  221. /* The root directory (this is needed by the system independent stuff
  222.    as the default for local-send).  */
  223. #define ZROOTDIR "/"
  224.  
  225. /* The name of the execution directory within the spool directory
  226.    (this is need by the system independent uuxqt.c).  */
  227. #define XQTDIR ".Xqtdir"
  228.  
  229. /* The name of the directory in which we preserve file transfers that
  230.    failed.  */
  231. #define PRESERVEDIR ".Preserve"
  232.  
  233. /* The length of the sequence number used in a file name.  */
  234. #define CSEQLEN (4)
  235.  
  236. /* Get some standard definitions.  Avoid including the files more than
  237.    once--some might have been included by uucp.h.  */
  238. #if USE_STDIO && HAVE_UNISTD_H
  239. #include <unistd.h>
  240. #endif
  241. #if ! USE_TYPES_H
  242. #include <sys/types.h>
  243. #endif
  244. #include <sys/stat.h>
  245.  
  246. /* Get definitions for the file permission bits.  */
  247.  
  248. #ifndef S_IRWXU
  249. #define S_IRWXU 0700
  250. #endif
  251. #ifndef S_IRUSR
  252. #define S_IRUSR 0400
  253. #endif
  254. #ifndef S_IWUSR
  255. #define S_IWUSR 0200
  256. #endif
  257. #ifndef S_IXUSR
  258. #define S_IXUSR 0100
  259. #endif
  260.  
  261. #ifndef S_IRWXG
  262. #define S_IRWXG 0070
  263. #endif
  264. #ifndef S_IRGRP
  265. #define S_IRGRP 0040
  266. #endif
  267. #ifndef S_IWGRP
  268. #define S_IWGRP 0020
  269. #endif
  270. #ifndef S_IXGRP
  271. #define S_IXGRP 0010
  272. #endif
  273.  
  274. #ifndef S_IRWXO
  275. #define S_IRWXO 0007
  276. #endif
  277. #ifndef S_IROTH
  278. #define S_IROTH 0004
  279. #endif
  280. #ifndef S_IWOTH
  281. #define S_IWOTH 0002
  282. #endif
  283. #ifndef S_IXOTH
  284. #define S_IXOTH 0001
  285. #endif
  286.  
  287. #ifndef S_ISDIR
  288. #ifdef S_IFDIR
  289. #define S_ISDIR(i) (((i) & S_IFMT) == S_IFDIR)
  290. #else /* ! defined (S_IFDIR) */
  291. #define S_ISDIR(i) (((i) & 0170000) == 040000)
  292. #endif /* ! defined (S_IFDIR) */
  293. #endif /* ! defined (S_ISDIR) */
  294.  
  295. /* We need the access macros.  */
  296. #ifndef R_OK
  297. #define R_OK 4
  298. #define W_OK 2
  299. #define X_OK 1
  300. #define F_OK 0
  301. #endif /* ! defined (R_OK) */
  302.  
  303. /* We create files with these modes (should this be configurable?).  */
  304. #define IPRIVATE_FILE_MODE (S_IRUSR | S_IWUSR)
  305. #define IPUBLIC_FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
  306.  
  307. /* We create directories with this mode (should this be configurable?).  */
  308. #define IDIRECTORY_MODE (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)
  309. #define IPUBLIC_DIRECTORY_MODE (S_IRWXU | S_IRWXG | S_IRWXO)
  310.  
  311. #if ! HAVE_OPENDIR
  312.  
  313. /* Define some structures to use if we don't have opendir, etc.  These
  314.    will only work if we have the old Unix filesystem, with a 2 byte
  315.    inode and a 14 byte filename.  */
  316.  
  317. #include <sys/dir.h>
  318.  
  319. struct dirent
  320. {
  321.   char d_name[DIRSIZ + 1];
  322. };
  323.  
  324. typedef struct
  325. {
  326.   int o;
  327.   struct dirent s;
  328. } DIR;
  329.  
  330. extern DIR *opendir P((const char *zdir));
  331. extern struct dirent *readdir P((DIR *));
  332. extern int closedir P((DIR *));
  333.  
  334. #endif /* ! HAVE_OPENDIR */
  335.  
  336. #if ! HAVE_FTW_H
  337.  
  338. /* If there is no <ftw.h>, define the ftw constants.  */
  339.  
  340. #define FTW_F (0)
  341. #define FTW_D (1)
  342. #define FTW_DNR (2)
  343. #define FTW_NS (3)
  344.  
  345. #endif /* ! HAVE_FTW_H */
  346.  
  347. /* This structure holds the system dependent information we keep for a
  348.    connection.  This is used by the TCP and TLI code.  */
  349.  
  350. struct ssysdep_conn
  351. {
  352.   /* File descriptor.  */
  353.   int o;
  354.   /* Device name.  */
  355.   char *zdevice;
  356.   /* File status flags.  */
  357.   int iflags;
  358.   /* File status flags for descriptor 1 (-1 if not standard input).  */
  359.   int istdout_flags;
  360.   /* Hold the real descriptor when using a dialer device.  */
  361.   int ohold;
  362.   /* TRUE if this is a terminal and the remaining fields are valid.  */
  363.   boolean fterminal;
  364.   /* TRUE if this is a TLI descriptor.  */
  365.   boolean ftli;
  366.   /* Baud rate.  */
  367.   long ibaud;
  368.   /* Original terminal settings.  */
  369.   sterminal sorig;
  370.   /* Current terminal settings.  */
  371.   sterminal snew;
  372. #if HAVE_COHERENT_LOCKFILES
  373.   /* On Coherent we need to hold on to the real port name which will
  374.      be used to enable the port.  Ick.  */
  375.   char *zenable;
  376. #endif
  377. };
  378.  
  379. /* These functions do I/O and chat scripts to a port.  They are called
  380.    by the TCP and TLI routines.  */
  381. extern boolean fsysdep_conn_read P((struct sconnection *qconn,
  382.                     char *zbuf, size_t *pclen,
  383.                     size_t cmin, int ctimeout,
  384.                     boolean freport));
  385. extern boolean fsysdep_conn_write P((struct sconnection *qconn,
  386.                      const char *zbuf, size_t clen));
  387. extern boolean fsysdep_conn_io P((struct sconnection *qconn,
  388.                   const char *zwrite, size_t *pcwrite,
  389.                   char *zread, size_t *pcread));
  390. extern boolean fsysdep_conn_chat P((struct sconnection *qconn,
  391.                     char **pzprog));
  392.  
  393. /* Set a signal handler.  */
  394. extern void usset_signal P((int isig, RETSIGTYPE (*pfn) P((int)),
  395.                 boolean fforce, boolean *pfignored));
  396.  
  397. /* Default signal handler.  This sets the appropriate element of the
  398.    afSignal array.  If system calls are automatically restarted, it
  399.    may do a longjmp to an fsysdep_catch.  */
  400. extern RETSIGTYPE ussignal P((int isig));
  401.  
  402. /* Try to fork, repeating several times.  */
  403. extern pid_t ixsfork P((void));
  404.  
  405. /* Spawn a job.  Returns the process ID of the spawned job or -1 on
  406.    error.  The following macros may be passed in aidescs.  */
  407.  
  408. /* Set descriptor to /dev/null.  */
  409. #define SPAWN_NULL (-1)
  410. /* Set element of aidescs to a pipe for caller to read from.  */
  411. #define SPAWN_READ_PIPE (-2)
  412. /* Set element of aidescs to a pipe for caller to write to.  */
  413. #define SPAWN_WRITE_PIPE (-3)
  414.  
  415. extern pid_t ixsspawn P((const char **pazargs, int *aidescs,
  416.              boolean fkeepuid, boolean fkeepenv,
  417.              const char *zchdir, boolean fnosigs,
  418.              boolean fshell, const char *zpath,
  419.              const char *zuu_machine,
  420.              const char *zuu_user));
  421.  
  422. /* Do a form of popen using ixsspawn.  */
  423. extern FILE *espopen P((const char **pazargs, boolean frd,
  424.             pid_t *pipid));
  425.  
  426. /* Wait for a particular process to finish, returning the exit status.
  427.    The process ID should be pid_t, but we can't put that in a
  428.    prototype.  */
  429. extern int ixswait P((unsigned long ipid, const char *zreport));
  430.  
  431. /* Find a spool file in the spool directory.  For a local file, the
  432.    bgrade argument is the grade of the file.  This is needed for
  433.    SPOOLDIR_SVR4.  */
  434. extern char *zsfind_file P((const char *zsimple, const char *zsystem,
  435.                 int bgrade));
  436.  
  437. /* Return the grade given a sequence number.  */
  438. extern char bsgrade P((pointer pseq));
  439.  
  440. /* Lock a string.  */
  441. extern boolean fsdo_lock P((const char *, boolean fspooldir,
  442.                 boolean *pferr));
  443.  
  444. /* Unlock a string.  */
  445. extern boolean fsdo_unlock P((const char *, boolean fspooldir));
  446.  
  447. /* Check access for a particular user name, or NULL to check access
  448.    for any user.  */
  449. extern boolean fsuser_access P((const struct stat *, int imode,
  450.                 const char *zuser));
  451.  
  452. /* Stick two directories and a file name together.  */
  453. extern char *zsappend3 P((const char *zdir1, const char *zdir2,
  454.               const char *zfile));
  455.  
  456. /* Stick three directories and a file name together.  */
  457. extern char *zsappend4 P((const char *zdir1, const char *zdir2,
  458.               const char *zdir3, const char *zfile));
  459.  
  460. /* Get a temporary file name.  */
  461. extern char *zstemp_file P((const struct uuconf_system *qsys));
  462.  
  463. /* Get a command file name.  */
  464. extern char *zscmd_file P((const struct uuconf_system *qsys, int bgrade));
  465.  
  466. /* Get a jobid from a system, a file name, and a grade.  */
  467. extern char *zsfile_to_jobid P((const struct uuconf_system *qsys,
  468.                 const char *zfile,
  469.                 int bgrade));
  470.  
  471. /* Get a file name from a jobid.  This also returns the associated system
  472.    in *pzsystem and the grade in *pbgrade.  */
  473. extern char *zsjobid_to_file P((const char *zid, char **pzsystem,
  474.                 char *pbgrade));
  475.  
  476. /* See whether there is a spool directory for a system when using
  477.    SPOOLDIR_ULTRIX.  */
  478. extern boolean fsultrix_has_spool P((const char *zsystem));
  479.  
  480. #if HAVE_COHERENT_LOCKFILES
  481. /* Lock a coherent tty.  */
  482. extern boolean lockttyexist P((const char *z));
  483. extern boolean fscoherent_disable_tty P((const char *zdevice,
  484.                      char **pzenable));
  485. #endif
  486.  
  487. /* Some replacements for standard Unix functions.  */
  488.  
  489. #if ! HAVE_DUP2
  490. extern int dup2 P((int oold, int onew));
  491. #endif
  492.  
  493. #if ! HAVE_FTW
  494. extern int ftw P((const char *zdir,
  495.           int (*pfn) P((const char *zfile,
  496.                 const struct stat *qstat,
  497.                 int iflag)),
  498.           int cdescriptors));
  499. #endif
  500.  
  501. #if ! HAVE_GETCWD && ! HAVE_GETWD
  502. extern char *getcwd P((char *zbuf, size_t cbuf));
  503. #endif
  504.  
  505. #if ! HAVE_MKDIR
  506. extern int mkdir P((const char *zdir, int imode));
  507. #endif
  508.  
  509. #if ! HAVE_RENAME
  510. extern int rename P((const char *zold, const char *znew));
  511. #endif
  512.  
  513. #if ! HAVE_RMDIR
  514. extern int rmdir P((const char *zdir));
  515. #endif
  516.  
  517. /* The working directory from which the program was run (this is set
  518.    by usysdep_initialize if called with INIT_GETCWD).  */
  519. extern char *zScwd;
  520.  
  521. /* The spool directory name.  */
  522. extern const char *zSspooldir;
  523.  
  524. /* The lock directory name.  */
  525. extern const char *zSlockdir;
  526.  
  527. /* The local UUCP name (needed for some spool directory stuff).  */
  528. extern const char *zSlocalname;
  529.  
  530. #endif /* ! defined (SYSH_UNX_H) */
  531.